package com.efast.cafe.util;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

public class StringValidationUtils {

	/**
	 * 校验邮箱格式
	 * @param email
	 * @return
	 */
	public static boolean checkEmail(String value){
		if(StringUtils.isBlank(value)){return false;}
		return value.matches("[\\w\\.\\-]+@([\\w\\-]+\\.)+[\\w\\-]+");
	}
	
	/**
	 * 校验固话 区号+座机号码+分机号码
	 * @param value
	 * @return
	 */
	public static boolean checkPhone(String value){
		if(StringUtils.isBlank(value)){return false;}
		String reg="(?:(\\(\\+?86\\))(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)|" +  
                "(?:(86-?)?(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)"; 
		return Pattern.matches(reg, value);
	}
	
	/**
	 * 校验mobile
	 * 验证手机号码（支持国际格式，+86135xxxx...（中国内地），+00852137xxxx...（中国香港））
	 *			移动的号段：134(0-8)、135、136、137、138、139、147（预计用于TD上网卡） 
	 *			150、151、152、157（TD专用）、158、159、187（未启用）、188（TD专用）
	 *			联通的号段：130、131、132、155、156（世界风专用）、185（未启用）、186（3g）	
	 *			电信的号段：133、153、180（未启用）、189
	 * @param value
	 * @return
	 */
	public static boolean checkMobile(String value){
		if(StringUtils.isBlank(value)){return false;}
		return Pattern.matches("(\\+\\d+)?1[3458]\\d{9}$", value);
	}
	
	/**
	 * 校验URL
	 * @param value
	 * @return
	 */
	public static boolean checkURL(String value){
		if(StringUtils.isBlank(value)){return false;}
		String regexStr = "^((https|http|ftp|rtsp|mms)?://)"  
                + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp的user@  
               + "(([0-9]{1,3}\\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184  
                 + "|" // 允许IP和DOMAIN（域名）
                 + "([0-9a-z_!~*'()-]+\\.)*" // 域名- www.  
                 + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\\." // 二级域名  
                + "[a-z]{2,6})" // first level domain- .com or .museum  
                + "(:[0-9]{1,4})?" // 端口- :80  
                + "((/?)|" // a slash isn't required if there is no file name  
                + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$"; 
		return Pattern.matches(regexStr ,value);
	}
	
	/**
	 * 校验ipv4
	 * 
	 * @param value
	 * @return
	 */
	public static boolean checkIPV4(String value) {
		if(StringUtils.isBlank(value)){return false;}
		Pattern ptipv4 = Pattern
				.compile("^(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}$");
		return ptipv4.matcher(value).matches();
	}
	
	/**
	 * 校验ipv6
	 * 
	 * @param value
	 * @return
	 */
	public static boolean checkIPV6(String value) {
		if(StringUtils.isBlank(value)){return false;}
		Pattern pattern = Pattern.compile(
				"^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:)|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}(:[0-9A-Fa-f]{1,4}){1,2})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){1,3})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){1,4})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){1,5})|([0-9A-Fa-f]{1,4}:(:[0-9A-Fa-f]{1,4}){1,6})|(:(:[0-9A-Fa-f]{1,4}){1,7})|(([0-9A-Fa-f]{1,4}:){6}(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){5}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){4}(:[0-9A-Fa-f]{1,4}){0,1}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){3}(:[0-9A-Fa-f]{1,4}){0,2}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(([0-9A-Fa-f]{1,4}:){2}(:[0-9A-Fa-f]{1,4}){0,3}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|([0-9A-Fa-f]{1,4}:(:[0-9A-Fa-f]{1,4}){0,4}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3})|(:(:[0-9A-Fa-f]{1,4}){0,5}:(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.(\\d|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}))$");
		return pattern.matcher(value).matches();
	}
	
	/**
	 * 校验身份证号格式
	 * @param value
	 * @return
	 */
	public static boolean checkCard(String value){
		if(StringUtils.isBlank(value)){return false;}
		String reg = "^\\d{15}$|^\\d{17}[0-9Xx]$";
		return value.matches(reg);
	}
	
	/**
	 * 校验QQ号格式 要求5~15位，不能以0开头，只能是数字
	 * @param value
	 * @return
	 */
	public static boolean checkQQ(String value){
		if(StringUtils.isBlank(value)){return false;}
		String regex = "[1-9]\\d{4,14}";
		return value.matches(regex);
	}
	
	/**
	 * 银行卡号格式校验 19位数字
	 * @param value
	 * @return
	 */
	public static boolean checkBankNum(String value){
		if(StringUtils.isBlank(value)){return false;}
		return value.matches("^\\d{19}$");
	}
	
	/**
	 * 校验车牌号
	 * @param value
	 * @return
	 */
	public static boolean checkPlate(String value){
		if(StringUtils.isBlank(value)){return false;}
		Pattern pattern = Pattern.compile("^[\u4e00-\u9fa5|WJ]{1}[A-Z0-9]{6}$");
		return pattern.matcher(value).matches();
	}
	
	/**
	 * 校验邮政编码
	 * @param value
	 * @return
	 */
	public static boolean checkChinaZip(String value){
		if(StringUtils.isBlank(value)){return false;}
		return Pattern.matches("[1-9]\\d{5}", value);  
	}
	
	/**
	 * 全英文输入校验
	 * @param value
	 * @return
	 */
	public static boolean checkEnglish(String value){
		if(StringUtils.isBlank(value)){return false;}
		 return value.matches("[A-z]+-?[A-z]+");
	}
	
	/**
	 * 校验中文
	 * @param value
	 * @return
	 */
	public static boolean checkChinese(String value){
		if(StringUtils.isBlank(value)){return false;}
		Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]");  
        char c[] = value.toCharArray();  
        for(int i=0;i<c.length;i++){  
            Matcher matcher = pattern.matcher(String.valueOf(c[i]));  
            if(!matcher.matches()){  
                return false;  
            }  
        }  
        return true;  
	}
	
	/**
	 * 校验是否是数字
	 * @param value
	 * @return
	 */
	public static boolean checkNumber(String value){
		if(StringUtils.isBlank(value)){return false;}
		String reg="^\\d+$";
		return value.matches(reg);
				
	}
	
	
	public static boolean checkString(String checkType,String value){
		boolean check = true;
		switch (checkType){
			case "emailCheck"://邮箱校验
				check = checkEmail(value);
				break;
			case "phoneCheck"://固话校验
				//区号+座机号码+分机号码 
				check = checkPhone(value);
				break;
			case "mobileCheck":
				check = checkMobile(value);
				break;
			case "urlCheck":
				check = checkURL(value);
				break;
			case "ipv4Check":
				check = checkIPV4(value);
				break;
			case "ipv6Check":
				check = checkIPV6(value);
				break;
			case "cardCheck":
				check = checkCard(value);
				break;
			case "qqCheck" :
				check = checkQQ(value);
				break;
			case "bankNumCheck" :
				check = checkBankNum(value);
				break;
			case "plateNumber" :
				check = checkPlate(value);
				break;
			case "chinaZipCheck" :
				check = checkChinaZip(value);
				break;
			case "englishCheck" :
				check = checkEnglish(value);
				break;
			case "chineseCheck" :
				check = checkChinese(value);
				break;
			case "numCheck" :
				check = checkNumber(value);
				break;
		}
		return check;
	}
}
